/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.dao;

import br.com.folha.controller.LoginController;
import br.com.folha.entity.DiaSemana;
import br.com.folha.entity.Professor;
import br.com.folha.entity.Turma;
import br.com.folha.entity.TurmaAula;
import br.com.folha.entity.Unidade;
import br.com.folha.utilidades.HibernateUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.persistence.NoResultException;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author marceloml
 */
public class TurmaDao implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private Long resultado;        
    private HashMap<String, Integer> unidades;
    private Integer maxSeq;
    
    public Turma getById(int id)
    { 
       Session sessao = HibernateUtil.getSessionFactory();
       Query query = sessao.createQuery("FROM Turma WHERE id = :id");               
       query.setParameter("id", id);        

       return (Turma) query.uniqueResult();
    }    
    
    public TurmaAula getByIdAula(int id)
    { 
       Session sessao = HibernateUtil.getSessionFactory();
       Query query = sessao.createQuery("FROM TurmaAula WHERE id = :id");               
       query.setParameter("id", id);        

       return (TurmaAula) query.uniqueResult();
    }    
    
    public Long consultaTurma(String nome) {
        Session sessao = HibernateUtil.getSessionFactory();
        //Boolean resultado;
        Query query  = sessao.createQuery("select count(*) as contador from Turma where nome=:pnome");
        query.setParameter("pnome",nome);
            try{
             resultado=(Long) query.list().get(0);
            }catch(NoResultException e){
                resultado=null;
            }finally{
                sessao.close();
            }
            return resultado;       
    }
    
    /*
     * Consulta utilizada para verficar se o professor já está dando aular no mesmo horário e dia da semana
     */
    public List<TurmaAula> consultaAula(Professor professor, DiaSemana dia, Date horaini, Date horafim) {
        Session sessao = HibernateUtil.getSessionFactory();
        List<TurmaAula> listaTurmaAula;
         Query query  = sessao.createQuery("from TurmaAula where cd_professor=:pprofessor and dia_semana =:pdia and ((hora_ini between :phoraini and :phorafim) or (hora_fim between :phoraini and :phorafim))");
       
        query.setParameter("pprofessor",professor);
        query.setParameter("pdia",dia);
        query.setParameter("phoraini",horaini);
        query.setParameter("phorafim",horafim);
            try{
             listaTurmaAula = query.list();
            }catch(NoResultException e){
                listaTurmaAula=null;
            }finally{
                sessao.close();
            }
            return listaTurmaAula;       
    }    
    
    public List<Object> listaTurma(Class t){
        Session sessao = HibernateUtil.getSessionFactory();
        LoginController login = new LoginController();
        Criteria criteria = sessao.createCriteria(t);
        criteria.createAlias("unidade", "p");
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        criteria.setFetchMode("p.unidade", FetchMode.SELECT);
                        
        List<Integer> integerArray = new ArrayList<Integer>();
        
        for (Iterator iterator = login.Usuario.getUnidades().iterator(); iterator.hasNext();){
            
            Unidade unidade = (Unidade) iterator.next();                     
            
            integerArray.add(unidade.getId());
        
        }        
        
        criteria.add(Restrictions.in("p.id", integerArray));        
        List lista = criteria.list();        
        sessao.close();
        return lista;                        
    }           
    
    public List<Object> listaAula(Class t, Integer turma){

        Session sessao = HibernateUtil.getSessionFactory();                
            
            Criteria criteria = sessao.createCriteria(t);   
            criteria.createAlias("disciplina", "d");
            criteria.createAlias("professor", "p");                                    
            criteria.createAlias("diaSemana", "ds");
            criteria.createAlias("turma", "t");
            criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
            criteria.addOrder((Order.asc("diaSemana")));
            criteria.addOrder((Order.asc("horaIni")));
            
            criteria.add(Restrictions.eq("t.id", turma));        
       
        List lista = criteria.list();
        sessao.close();
        return lista;                        
    }
    
       public List<TurmaAula> consultaAulaProfessor(Professor professor) {
        Session sessao = HibernateUtil.getSessionFactory();
        List<TurmaAula> listaTurmaAula;
        
        Query query  = sessao.createQuery("from TurmaAula where cd_professor=:pprofessor");
       
        query.setParameter("pprofessor",professor);

            try{
             listaTurmaAula = query.list();
            }catch(NoResultException e){
                listaTurmaAula=null;
            }finally{
                sessao.close();
            }
            return listaTurmaAula;       
    }
       
    public List<Turma> listaTurmaUnidade(Integer unidade){
        Session sessao = HibernateUtil.getSessionFactory();
        
        Criteria criteria = sessao.createCriteria(Turma.class);
        criteria.createAlias("unidade", "p");      
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);        
        
        criteria.add(Restrictions.eq("p.id", unidade));        
        List lista = criteria.list();        
        sessao.close();
        return lista;                        
    }     
    
    public List<TurmaAula> listaTurmaAula(Integer turma){
        
        Session sessao = HibernateUtil.getSessionFactory();
        
        Criteria criteria = sessao.createCriteria(TurmaAula.class);
        criteria.createAlias("turma", "t");      
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        
        criteria.add(Restrictions.eq("t.id", turma));        
        List lista = criteria.list();        
        sessao.close();
        return lista;         
        
    }
    
}